package ca.uqac.dim.turtledb.physical;

import ca.uqac.dim.turtledb.Engine;

import java.util.*;

/**
 * User: damien
 * Date: 12-12-02
 * Time: 01:21
 * <p/>
 * Represente un Site
 * Définie par un nom
 * Contient une Engine
 * Contient un CoutStockageUnitaire
 * Contient une Liste de ses fragments
 * <p/>
 * Le site est le noeud dans le graphe physique
 * Il dispose donc d'une liste des arcs lui étant liés
 * <p/>
 * Attention, un site ne contient qu'une Engine, il ne dispose donc que d'un fragment par table (limite du à l'engine)
 * Ajouter un deuxieme fragment d'une table effacerait le premier
 */
public class Site extends Network.NetworkMember {
    private String name;
    private Engine localEngine;
    private float coutStockageUnitaire = 0;
    private Map<String, Fragment> fragments = new HashMap<String, Fragment>(); // Map<NomTable, Fragment>


    List<Link> liens = new ArrayList<Link>();

    public Site(String name , float coutStockageUnitaire) {
        this.name = name;
        this.coutStockageUnitaire = coutStockageUnitaire;
        localEngine = new Engine(this.name);
    }

    public Site(String name, List<Fragment> fragments, float coutStockageUnitaire) {
        this.name = name;
        this.coutStockageUnitaire = coutStockageUnitaire;
        this.localEngine = new Engine(this.name);
        for (Fragment fragment : fragments) {
            addFragment(fragment);
        }
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Engine getLocalEngine() {
        return localEngine;
    }

    public float getCoutStockageUnitaire() {
        return coutStockageUnitaire;
    }

    public void setCoutStockageUnitaire(int coutStockageUnitaire) {
        this.coutStockageUnitaire = coutStockageUnitaire;
    }

    public List<Link> getLiens() {
        return liens;
    }

    void addLien(Link link) {
        liens.add(link);
    }

    void removeLien(Link link) {
        removeLien(link);
    }

    public final Map<String, Fragment> getFragments() {
        return fragments;
    }

    public void addFragment(Fragment fragment) {
        fragment.setHost(this);
        localEngine.putRelation(fragment.getName(), fragment);
        fragments.put(fragment.getName(), fragment);
    }

    public List<Link> getPath(Site destination) {
        List<Link> path = new LinkedList<Link>();
        for(Link link : liens) {
            if(link.getSiteDroit().equals(this)){
                Site siteDeLAutreCote = link.getSiteGauche();
                if(siteDeLAutreCote.equals(destination)){
                    path.add(link);
                }
            }
        }
        if(path.isEmpty()) {
            //TODO : Chercher un chemin indirect
        }
        return path;
    }
}

